﻿using System;
using System.Collections.Generic;
using System.Text;

namespace daBase.Objects
{
    /// <summary>
    /// Расширенный Char
    /// </summary>
    public class DChar
    {
        // 16-тиричные цифры
        public static List<char> hexchars;

        /// <summary>
        /// Является ли цифрой
        /// </summary>
        public static bool IsDigit(char c)
        {
            return Char.IsDigit(c);
        }

        /// <summary>
        /// Является ли буквой
        /// </summary>
        public static bool IsLetter(char c)
        {
            return Char.IsLetter(c);
        }

        /// <summary>
        /// Является ли цифрой или буквой
        /// </summary>
        public static bool IsLetterOrDigit(char c)
        {
            // сократим код
            return Char.IsLetter(c) || Char.IsDigit(c);
        }

        /// <summary>
        /// Является ли 16-тиричной цифрой
        /// </summary>
        /// <param name="c"></param>
        /// <returns></returns>
        public static bool IsHexSymbol(char c)
        {
            if (hexchars == null)
            {
                string hexs = "abcdefABCDEF";
                hexchars = new List<char>();
                foreach (char hex in hexs)
                    hexchars.Add(hex);
            }
            return Char.IsDigit(c) || hexchars.Contains(c);
        }

        public static bool IsSeparator(char c)
        {
            switch (c)
            {
                case ' ':
                case '\n':
                case '\t':
                    return true;
            }
            return false;
        }

        /// <summary>
        /// Преобразовать число из 16-тиричной в 10-тичную систему счисления
        /// </summary>
        /// <param name="digit">число в 16-тиричной системе счисления</param>
        /// <returns>число в 10-тичной системе счисления</returns>
        public static byte HexToByte(char digit)
        {
            byte code = (byte)digit;
            if ((code > 47) && (code < 58))
                return ((byte)(code - 48));
            else if ((code > 64) && (code < 71))
                return ((byte)(code - 55));
            return 0;
        }

        /// <summary>
        /// Преобразовать hex-строку в символ с соответствующим кодом
        /// </summary>
        /// <param name="hex">hex-строка</param>
        /// <returns>символ</returns>
        public static char FromHexCode(string hex)
        {
            byte h = 0, l = 0;
            if (hex.Length > 1)
            {
                h = HexToByte(hex[0]);
                l = HexToByte(hex[1]);
            }
            else if (hex.Length > 0)
                l = HexToByte(hex[0]);
            return ((char)(h * 16 + l));
        }

        /// <summary>
        /// Преобразовать hex-строку в набор символов с соответствующим кодом
        /// </summary>
        /// <param name="hex">hex-строка</param>
        /// <returns>выходная строка символов</returns>
        public static string AllFromHexCode(string hex)
        {
            string result = string.Empty;
            hex = hex.ToUpper();
            while (hex.Length > 1)
            {
                result += FromHexCode(hex);
                hex = hex.Substring(2);
            }
            if (hex.Length > 0) result += FromHexCode(hex);
            return result;
        }
    }
}
